// prototype & __proto__

// 原型本身是一个function函数       在python中可以理解成是class
// 创建一个原型
function User(name, pwd) {
    this.UserName = name;
    this.pwd = pwd;
    this.regist = function () {
        console.log(this.UserName + "在注册");
    }
}

// 实例对象   通过new创建的对象
let u1 = new User('jay', 232)
let u2 = new User('tom', 31232)

// 获取User这个原型的原型对象
console.log(u1.__proto__ == User.prototype);

console.log(u1.UserName, u1.pwd);
console.log(u2.UserName, u2.pwd);

u1.regist();
u2.regist();

// console.log(u1.address,u1.gender);    undefined undefined
// console.log(u2.address,u2.gender);    undefined undefined

// 原型对象   原型对象用于存储所有示例对象共享的属性和方法，以减少每个示例对象重复存储相同属性和方法的开销
// 创建原型对象
// User.prototype  // 创建出来了一个 User原型的原型对象

// 通过原型对象给原型创建好的所有的实例对象创建共有的成员
User.prototype.address = "Shanghai"
User.prototype.gender = "Male"

console.log(u1.address = "GuangDon", u1.gender = "man");   // GuangDon man
console.log(u2.address, u2.gender);                    // Shanghai Male

// 原型链    javascript 中对象继承属性和方法的一种方式       （类似于python继承）

// 实例对象
user = new User("alen", 10)

// 对于实例对象的正常操作
console.log(user.UserName, user.pwd);
user.regist()

console.log('-------------- 如下是非正常操作 -------------')
console.log(user.address = "ShengZheng");

// 顶级 Object 原型对象才有 toString()       原型链 一直会往原型链 顶级去找自己没有的方法
console.log("toString() = ", user.toString());   // toString 一定是来自当前实例对象原型的原型